//package com.light.dp.flink.utils;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import java.sql.*;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @Description:
// * @Author: zgs
// * @Date: 2023-2-21 10:39
// */
//@Slf4j
//@Component
//public class DataBaseUtils {
//
//    private static final String FIELDS = " SHOW FULL FIELDS FROM ";
//
////    @Resource
////    private Map<String, HikariDataSource> hikariDataSourceMap;
//
////    @Resource
////    private TargetProperties targetProperties;
//
//    private static Map<String, HikariDataSource> staticHikariDataSourceMap = new HashMap<>();
//
//    private static final Logger errorSqlLog = LoggerFactory.getLogger("errorSql");
//
//    private static final Map<String, Set<String>> columnNames = new HashMap<>();
//
//    private static final Map<String, List<TargetInfo>> targetTableMap = new HashMap<>();
//
//    public void init() throws SQLException {
////        staticHikariDataSourceMap = hikariDataSourceMap;
////        Map<String, List<TargetInfo>> instances = targetProperties.getInstances();
////        instances.forEach((unique, targetInfos) -> {
////            //初始化库表字段
////            for (TargetInfo data : targetInfos) {
////                for (String table : data.getTables()) {
////                    try {
////                        DataBaseUtils.refreshColumnNames(data.getDatabase(), table);
////                    } catch (SQLException e) {
////                        throw new RuntimeException(e);
////                    }
////                }
////            }
////            DataBaseUtils.setTargetTableMap(targetInfos);
////        });
//    }
//
//    public static HikariDataSource getHikariDataSource(String serverName) {
//        return staticHikariDataSourceMap.get(serverName);
//    }
//
//    public static Set<String> getColumnNames(String dbName, String tableName) {
//        return columnNames.get(dbName + "#" + tableName);
//    }
//
//    public static void refreshColumnNames(String dbName, String tableName) throws SQLException {
//        Set<String> list = new HashSet<>();
//        HikariDataSource hikariDataSource = getHikariDataSource(dbName);
//        String sql = FIELDS + "`" + dbName + "`.`" + tableName + "`";
//        try (Connection con = hikariDataSource.getConnection();
//             PreparedStatement ps = con.prepareStatement(sql)) {
//            ResultSet rs = ps.executeQuery();
//            while (rs.next()) {
//                list.add(rs.getString("Field"));
//            }
//        }
//        log.debug("db:{}    table:{}    字段共:{}个，分别为：{}", dbName, tableName, list.size(), JSONObject.toJSONString(list));
//        columnNames.put(dbName + "#" + tableName, list);
//    }
//
//    public static void refreshColumnNames(Connection connection, String dbName, String tableName) throws SQLException {
//        Set<String> list = new HashSet<>();
//        String sql = FIELDS + "`" + dbName + "`.`" + tableName + "`";
//        try (PreparedStatement ps = connection.prepareStatement(sql)) {
//            ResultSet rs = ps.executeQuery();
//            while (rs.next()) {
//                list.add(rs.getString("Field"));
//            }
//        }
//        log.debug("db:{}    table:{}    字段共:{}个，分别为：{}", dbName, tableName, list.size(), JSONObject.toJSONString(list));
//        columnNames.put(dbName + "#" + tableName, list);
//    }
//
//    @Deprecated
//    private static Set<String> getColumnNameNormal(Connection connection, String tableName) throws SQLException {
//        Set<String> list = new HashSet<>();
//        ResultSet tables = connection.getMetaData().getColumns(connection.getCatalog(), "%", tableName, "%");
//        while (tables.next()) {
//            if (tables.getString("TABLE_NAME").equals(tableName)) {
//                list.add(tables.getString("COLUMN_NAME"));
//            }
//        }
//        return list;
//    }
//
//    public static boolean executeSQL(String database, List<String> sqlList) {
//        if (StrUtil.isEmpty(database) || CollUtil.isEmpty(sqlList)) {
//            return false;
//        }
//
//        Connection conn = null;
//        Statement stmt = null;
//        log.info("向{}数据库发送sql:{}", database, sqlList);
//        try {
//            conn = getHikariDataSource(database).getConnection();
//            conn.setAutoCommit(false);
//            for (String sql : sqlList) {
//                try {
//                    stmt = conn.createStatement();
//                    stmt.executeUpdate(sql);
//                    //提交事务
//                    conn.commit();
//                } catch (SQLException e) {
//                    log.error(StrUtil.format("数据库{}-执行sql出错,SQL={}", database, sqlList), e);
//                    /*
//                     * 不能其中某个数据库同步失败 全部回滚。单独为同步错误的数据库记录日志
//                     */
//                    errorSqlLog.error("向{}发送sql出错:{} > ", database, sql, e);
//                }
//            }
//            return true;
//        } catch (Exception e) {
//            if (conn != null) {
//                try {
//                    conn.rollback();
//                } catch (SQLException ex) {
//                    ex.printStackTrace();
//                }
//            }
//            return false;
//        } finally {
//            close(stmt, conn);
//        }
//    }
//
//    public static boolean executeSQL(Connection connection, String database, String sql) {
//        if (StrUtil.isEmpty(database) || StrUtil.isEmpty(sql)) {
//            return false;
//        }
//        Statement stmt;
//        log.info("向{}数据库发送sql:{}", database, sql);
//        try {
//            connection.setAutoCommit(false);
//            stmt = connection.createStatement();
//            stmt.executeUpdate(sql);
//            //提交事务
//            connection.commit();
//        } catch (SQLException e) {
//            log.error(StrUtil.format("数据库{}-执行sql出错,SQL={}", database, sql), e);
//            /*
//             * 不能其中某个数据库同步失败 全部回滚。单独为同步错误的数据库记录日志
//             */
//            errorSqlLog.error("向{}发送sql出错:{} > ", database, sql, e);
//            return false;
//        }
//        return true;
//    }
//
//    public static void close(AutoCloseable... t) {
//        for (AutoCloseable closeable : t) {
//            if (closeable != null) {
//                try {
//                    closeable.close();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//
//    public static Map<String, List<TargetInfo>> getTargetTableMap() {
//        return targetTableMap;
//    }
//
//
//    public static void setTargetTableMap(List<TargetInfo> properties) {
//        List<String> tables = properties.stream()
//                .flatMap(data -> data.getTables().stream())
//                .distinct()
//                .collect(Collectors.toList());
//        if (tables.isEmpty()) {
//            return;
//        }
//
//        for (String table : tables) {
//            List<TargetInfo> targetProperties = properties.stream()
//                    .filter(data -> data.getTables().contains(table))
//                    .collect(Collectors.toList());
//            targetTableMap.put(table, targetProperties);
//        }
//    }
//
//
//}
